package com.example.homeworktagger.controller;

import com.example.homeworktagger.model.Question;
import com.example.homeworktagger.service.MilvusService;
import dev.langchain4j.model.chat.ChatLanguageModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 题目搜索控制器
 * 
 * 处理题目搜索相关的请求，包括：
 * - 题目相似度搜索
 * - 搜索结果的处理和展示
 * - 使用大语言模型整理结果
 */
@Slf4j
@Controller
public class QuestionController {

    /** Milvus服务，用于向量搜索 */
    private final MilvusService milvusService;
    
    /** DeepSeek大语言模型，用于结果整理 */
    private final ChatLanguageModel deepseekModel;
    
    /**
     * 构造函数
     * 
     * @param milvusService Milvus服务
     * @param deepseekModel DeepSeek大语言模型
     */
    public QuestionController(
            MilvusService milvusService,
            @Qualifier("deepseekModel") ChatLanguageModel deepseekModel) {
        this.milvusService = milvusService;
        this.deepseekModel = deepseekModel;
    }

    /**
     * 显示题目搜索页面
     * 
     * @return 视图名称
     */
    @GetMapping("/question")
    public String index() {
        return "question";
    }

    /**
     * 处理题目搜索请求
     * 
     * @param query 搜索查询文本
     * @param model 模型数据
     * @return 搜索结果视图名称
     */
    @PostMapping("/search")
    public String searchSimilarQuestions(@RequestParam String query, Model model) {
        log.info("接收到搜索请求: {}", query);
        
        try {
            // 1. 搜索相似问题
            List<Question> similarQuestions = milvusService.searchSimilarQuestions(query);
            
            // 2. 限制结果为前3条
            List<Question> top3Questions = similarQuestions.stream()
                    .limit(3)
                    .collect(Collectors.toList());
            
            // 3. 使用大模型处理结果
            String processedResult = processWithAI(top3Questions);
    
            // 4. 添加结果到模型
            model.addAttribute("query", query);
            model.addAttribute("similarQuestions", top3Questions);
            model.addAttribute("processedResult", processedResult);
            
            log.info("搜索完成，找到 {} 条结果", top3Questions.size());
            return "search-result";
        } catch (Exception e) {
            log.error("搜索过程中发生错误", e);
            model.addAttribute("errorMessage", "搜索过程中发生错误: " + e.getMessage());
            return "error";
        }
    }
    
    /**
     * 使用AI模型处理搜索结果
     * 
     * @param questions 搜索结果题目列表
     * @return AI整理后的文本
     */
    private String processWithAI(List<Question> questions) {
        // 如果没有搜索结果，返回默认消息
        if (questions == null || questions.isEmpty()) {
            return "未找到相关题目。";
        }
        
        // 将题目格式化为文本
        StringBuilder questionsText = new StringBuilder();
        for (Question question : questions) {
            questionsText.append("问题：").append(question.getQuestion())
                    .append("\n答案：").append(question.getAnswer())
                    .append("\n相似度：").append(question.getSimilarity())
                    .append("\n\n");
        }

        // 构建提示词并调用大模型
        String prompt = "你是一位资深老师，请将输入的这些题目进行整理:\n\n" + questionsText.toString();
        return deepseekModel.generate(prompt);
    }
} 